package OOP;

/**
 * 1、当一个类中没有显式书写任何构造方法时，编译器会为当前类添加一个默认的构造方法
 *      默认的构造方法是 公开的 ( 被 public 修饰的 ) 、无参的 ( 没有任何参数 )
 *
 * 2、使用 new 关键字创建类的对象时，需要在 new 关键字之后 调用类的构造方法
 *
 * 3、类是抽象的，对象(实例)是具体的
 */

public class Constructor2 {
    //field(字段)
    public String name;
    public int age;
    public double weight;
    public double height;

    //Constructor
    // 当没有显式指定任何一个构造方法时，编译器会为当前类添加一个默认的构造方法
    // 默认的构造方法是 public 修饰的、与类名同名、没有任何参数 (所有构造方法都是没有返回类型的)
    public Constructor2(){
        System.out.println("Constructor2构造方法执行");
    }

    //method
    public void Panda(){
        System.out.println("我是" + name + "，今年" + age + "岁，体重" + weight + "kg，身高" + height + "cm");
    }

    public static void main(String [] args){
        // 1、new 负责在 堆内存 中开辟空间 ( 空间大小根据 Constructor2 类来确定 )
        // 2、为 Constructor2 类中定义的 field 赋予默认值 ( 基本数据类型统统是 零，引用类型统统是 null )
        // 3、执行构造方法 ( 通常是在构造方法中完成对 field 的初始化 )
        // 4、将 new Constructor2 在 堆内存 中 创建好的 Constructor2 对象 ( 实例 ) 的地址赋值给 c 变量

        Constructor2 c = new Constructor2();// new 关键字必须结合类的构造方法才能创建类的对象
        System.out.println(c);// 类型@哈希码

        // [谁] 调用 [谁] 的 [啥方法  [干了啥]  [返回了啥]
        c.Panda();// 【 main 调用 p 的 Panda 方法 输出了 c 的各个 field 的值 但没有返回数据 】

        c.name = "团团";
        c.age = 3;
        c.weight = 25.6;
        c.height = 121.5;

        c.Panda();

        System.out.println("------------------------------");

        c.name = "妮妮";
        c.age = 2;
        c.weight = 23;
        c.height = 110;

        c.Panda();

    }

}
